#ifndef MATRIX_H
#define MATRIX_H
#include "vec.h"
#define M33_ONE(N)  mat3x3 N; do{mat3x3_one(&N);}while(0)
#define M33_ZERO(N) mat3x3 N; do{mat3x3_zero(&N);}while(0)
typedef struct{
    union
    {
     float m[3][3];
    };
} mat3x3;
mat3x3 *mat3x3_inverse(mat3x3 *m33);
mat3x3 *mat3x3_inverse_copy(mat3x3 *out, const mat3x3 *m33);
mat3x3* mat3x3_mult_mat3x3(mat3x3 *left, const mat3x3 *right);
mat3x3 *mat3x3_mult_mat3x3_copy(mat3x3 *out, const mat3x3 *left, const mat3x3 *right);
vec3* mat3x3_mult_v3(const mat3x3* m33, vec3* v);
vec3* mat3x3_mult_v3_copy(vec3* out, const mat3x3* m33, const vec3* v);
mat3x3* mat3x3_zero(mat3x3* out);
mat3x3* mat3x3_one(mat3x3* out);
mat3x3* mat3x3_diag(mat3x3* out, float v);
mat3x3* mat3x3_copy(mat3x3* des, const mat3x3* src);

#endif 
